题的目标很简单,就是求两个正整数AB的和,其中AB都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式:

输入在一行给出AB,其间以空格分开。问题是AB不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是AB的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:

如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?

输入样例1:

1
123 456

输出样例1:

1
123 + 456 = 579

输入样例2:

1
22. 18

输出样例2:

1
? + 18 = ?

输入样例3:

1
-100 blabla bla...33

输出样例3:

1
? + ? = ?

思路

只有严格满足[1,1000]区间的正整数才是满足题目要求的

数字A与B之间用第一个空格相隔,在输入时要讲究一些

知识点:字符串与数字的相互转换、isdigit函数(感兴趣的可百度,还有很多用于判断字符是哪种类型的库函数)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>

using namespace std;

bool func(const string &str) { //判断数字str是否符合要求,引用提高效率
//这里同样可以for-each
for(int i = 0; i < (int)str.size(); i++) {
//可以使用isdigit函数判断字符是否为数字
if(str[i] < '0' || str[i] > '9') {//该字符不是数字
return false;
}
}
int t = stoi(str);
return t >= 1 && t <= 1000;//是否在[1,1000]内
}

int main() {
string a, b;
cin >> a;//第一个“数字”
getchar();//吸收中间的空格
getline(cin, b);//第二个“数字”可能有空格,所以getline
bool t1 = func(a);
bool t2 = func(b);
cout << (t1 ? a : "?") << " + ";
cout << (t2 ? b : "?") << " = ";
cout << (t1 && t2 ? to_string(stoi(a) + stoi(b)) : "?") << endl;
//三目运算,两个可能的输出必须数据类型相同,所以to_string(stoi(a) + stoi(b))
return 0;
}